package com.wzh.project.recursion;

import java.util.ArrayList;
import java.util.List;

public class RecurveMain {
	
	/**
	 * 用于存储结果
	 */
	private static int [][] form1=new int [4][4];
	/**
	 * 需要计算的值
	 */
	private static int[][] form2 = new int[][] { 
		{ 00, 01, 02, 03 }, 
		{ 10, 11, 12, 13 }, 
		{ 20, 21, 22, 23 },
		{ 30, 31, 32, 33 }, 
		};
	/**
	 * 操作符 									 
	 */
	private static String operation ="*";
	
	private static int A=2;
	
	public static void main(String[] args) {
		RecurveMain test=new RecurveMain();
		ArrayList<Integer> al=new ArrayList<Integer>();
		ArrayList<Integer> an=new ArrayList<Integer>();
		ArrayList<Integer> bl=new ArrayList<Integer>();
		ArrayList<Integer> bn=new ArrayList<Integer>();
		//结果存在11，13，21，23，31，33坐标处  下标从0开始
		al.add(1);
		al.add(2);
		al.add(3);
		
		an.add(1);
		an.add(3);
		
		//从哪个地方取值
		bl.add(2);
		bl.add(3);
		
		bn.add(1);
		bn.add(3);
		System.out.println(form1);
		test.invoke(form1, al, an, form2, bl, bn, operation);
		System.out.println(form1);
	}
	
	/**
	 * 递归函数解决遍历生成多个公式<br> 以a为主如果b中无对应的坐标保留a原始值
	 * @param a 		表单a		存储的结果位于该表单中
	 * @param al		表单a的行
	 * @param an		表单a的列
	 * @param b			表单b
	 * @param bl		表单b的行
	 * @param bn		表单b的列
	 * @param operation	操作符	也可使用list 表单a需要多加一维
	 */
	@SuppressWarnings({ "rawtypes" })
	private void invoke(int [][] a,List al,List an,int [][] b,List bl,List bn,String operation) {
		//对传递参数进行校验 可以自定义
		if(a==null||b==null||(al.size()<1)||(an.size()<1)||(bl.size()<1)||(bn.size()<1)) {
			return;
		}
		//递归出口
		if((al.size()==1)&&(an.size()==1)&&(bl.size()==1)&&(bn.size()==1)) {
			a[(int) al.get(0)][(int) an.get(0)]=handle(b[(int) bl.get(0)][(int) bn.get(0)],A);
		}else {
			//确定最后结果的值
			if((al.size()>1)) {
				ArrayList<Integer> altemp=new ArrayList<Integer>();
				ArrayList<Integer> bltemp=new ArrayList<Integer>();
				altemp.add((Integer) al.remove(0));
				bltemp.add((Integer) bl.remove(0));
				invoke(a, altemp, an, b, bltemp, bn, operation);
				invoke(a, al, an, b, bl, bn, operation);
			}else {
				if(an.size()>1) {
					//进行列遍历的时候使用值传递
					ArrayList<Integer> antemp1=new ArrayList<Integer>(an);
					ArrayList<Integer> bntemp1=new ArrayList<Integer>(bn);
					ArrayList<Integer> antemp2=new ArrayList<Integer>();
					ArrayList<Integer> bntemp2=new ArrayList<Integer>();
					antemp2.add((Integer) antemp1.remove(0));
					bntemp2.add((Integer) bntemp1.remove(0));
					invoke(a, al, antemp2, b, bl, bntemp2, operation);
					invoke(a, al, antemp1, b, bl, bntemp1, operation);
				}else {
					System.out.println("其他情况");
				}
			}
		}
	}
	
	/**
	 * 公式的计算
	 */
	private int handle(int a,int b) {
		return a*b;
	}

}
